// 观察者模式是一种设计模式：其中一个对象（称为Subject）,维持一系列依赖于它的（观察者）对象，将有关状态的任何变更自动通知给它们（观察者）
// ╭─────────────╮  Fire Event  ╭──────────────╮
// │             │─────────────>│              │
// │   Subject   │              │   Observer   │
// │             │<─────────────│              │
// ╰─────────────╯  Subscribe   ╰──────────────╯
// 被观察者
class Subject {
    constructor () {
        this.observers = []
    }

    add (observer) {
        this.observers.push(observer)
    }

    notify (...args) {
        this.observers.forEach(observer => observer.update(...args))
    }
}

// 观察者
class Observer {
    constructor (name) {
        this.name = name
    }

    update (...args) {
        console.log(this.name, ...args)
    }
}

// Test
const sub = new Subject() // 系统
sub.add(new Observer('张三')) // 张三点了订阅
sub.add(new Observer('李四')) // 李四点了订阅
sub.notify('do something') // 通知点了订阅的人
